package com.anuo.app.common.utils;

import org.apache.commons.lang3.concurrent.ConcurrentUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.UUID;
import java.util.concurrent.*;

/**
 * 并发编程工具类
 */
public class ConcurrentUtil {

    private static Logger logger=LoggerFactory.getLogger(ConcurrentUtil.class);
    public static ExecutorService createThreadPool(int threadNumber) {

        /*
        参数解释:
        @有界队列: 比如以下实例创建了一个最大任务队列为 10 的线程池, 即超过10个任务就会被丢弃(在控制台打印出),
            这样的有界队列好处是不至于过多的任务排队, 导致内存被撑爆, 丢弃的好处是不至于程序报错导致线程池终止,
            当然重要的任务也不应该丢弃,这个看应用场景选择即可.
        @拒绝策略指的是: 当任务数超过了最大队列时, 如何处理丢弃的任务, 一般如下例子, 将丢弃的打印或者记录日志
            默认是的拒绝策略是 In the default ThreadPoolExecutor.AbortPolicy, the handler throws a runtime RejectedExecutionException upon rejection.
         */
        ExecutorService threadPool = new ThreadPoolExecutor(
                threadNumber /*最小线程数(即使是空闲的,也保持这个数)*/
                , threadNumber/*最大线程数,一个线程大约1MB, 不要创建太多线程*/
                , 3L, TimeUnit.SECONDS/*线程完成任务后的存活时间 .  比如设为10秒, 完成任务后, 线程池会等10秒后再释放此线程, 如果10秒内有接到新任务, 那此线程就不会被释放*/
                , new LinkedBlockingDeque<>(200) /*有界队列, 即排队等待执行的最大任务数(详细见上面的方法注释)*/
                , Executors.defaultThreadFactory()
                , new RejectedExecutionHandler() { /*拒绝策略(详细见上面的方法注释)*/
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                logger.error(r.toString() + " is discard");
            }
        }
        );

        return threadPool;
    }

}